package com.bstech.Tabelle;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;

import com.bstech.Classi.Common;
import com.bstech.Utils.*;
import com.bstech.assistance.R;

public class Clienti {
	public static String TABLE_NAME = "CLIENTI";
	
	public static String ID_KEY = "ID";
	public static String DITTA_KEY = "DITTA";
	public static String CODICE_KEY = "CODICE";
	public static String DESCRIZIONE_KEY = "DESCRIZIONE";
	public static String INDIRIZZO_KEY = "INDIRIZZO";
	public static String CITTA_KEY = "CITTA";
	public static String TELEFONO_KEY = "TELEFONO";
	
	public static String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS "+ TABLE_NAME +"(" +
											  ID_KEY + " integer primary key not null," +
											  DITTA_KEY +" integer not null," +
											  CODICE_KEY +" integer not null," +
											  DESCRIZIONE_KEY +" text null," +
											  INDIRIZZO_KEY +" text null," +
											  CITTA_KEY +" text null," +
											  TELEFONO_KEY +" text null);";
	
	public static void UpdateToVersion(SQLiteDatabase db, int from, int to )
	{
		for(int ver = from +1; ver<= to; ver++)
		{
//			switch(ver)
//			{
//			case 2:
//				db.executeSql("");
//				break;
//			case 3:
//				db.executeSql("");
//				break;
//			}
		}
	}
	public static boolean Insert(int ID, int Ditta, String Codice, String Descrizione, String Indirizzo, String Citta, String Telefono){
		ContentValues cv = new ContentValues();
		
		cv.put(Clienti.ID_KEY, ID);
		cv.put(Clienti.DITTA_KEY, Ditta);
		cv.put(Clienti.CODICE_KEY, Strings.CheckString(Codice));
		cv.put(Clienti.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Clienti.INDIRIZZO_KEY, Strings.CheckString(Indirizzo));
		cv.put(Clienti.CITTA_KEY, Strings.CheckString(Citta));
		cv.put(Clienti.TELEFONO_KEY, Strings.CheckString(Telefono));
		
		return Common.db.Insert(Clienti.TABLE_NAME, null, cv);
	}
	public static boolean Update(int ID, int Ditta, String Codice, String Descrizione, String Indirizzo, String Citta, String Telefono){
		ContentValues cv = new ContentValues();
		
		cv.put(Clienti.ID_KEY, ID);
		cv.put(Clienti.DITTA_KEY, Ditta);
		cv.put(Clienti.CODICE_KEY, Strings.CheckString(Codice));
		cv.put(Clienti.DESCRIZIONE_KEY, Strings.CheckString(Descrizione));
		cv.put(Clienti.INDIRIZZO_KEY, Strings.CheckString(Indirizzo));
		cv.put(Clienti.CITTA_KEY, Strings.CheckString(Citta));
		cv.put(Clienti.TELEFONO_KEY, Strings.CheckString(Telefono));
		
		return Common.db.Update(Clienti.TABLE_NAME, cv, Clienti.ID_KEY + " = " + Integer.toString(ID), null);
		}
	public static Cliente Select(int ID)
	{
		Cursor cursor = Common.db.query(Clienti.TABLE_NAME, new String[] {Clienti.ID_KEY,Clienti.DITTA_KEY,Clienti.CODICE_KEY,Clienti.DESCRIZIONE_KEY,Clienti.INDIRIZZO_KEY,Clienti.CITTA_KEY,Clienti.TELEFONO_KEY},
				Clienti.ID_KEY + "= " + Integer.toString(ID),
				null, null,null, null);

		if(cursor != null && cursor.moveToFirst())
		{
			Cliente ret =  Select(cursor);
			cursor.close();
			return ret;
		}
		else
			return null;
	}
	public static List<Cliente> SelectAll()
	{
		//Cursor cursor = Common.db.query(Clienti.TABLE_NAME, new String[] {Clienti.ID_KEY,Clienti.DITTA_KEY,Clienti.CODICE_KEY,Clienti.DESCRIZIONE_KEY,Clienti.INDIRIZZO_KEY,Clienti.CITTA_KEY,Clienti.TELEFONO_KEY},
		//		 null,null, null,null, Clienti.DESCRIZIONE_KEY);
		Cursor cursor = Common.db.query(Clienti.TABLE_NAME, new String[] {Clienti.ID_KEY,Clienti.DITTA_KEY,Clienti.CODICE_KEY,Clienti.DESCRIZIONE_KEY,Clienti.INDIRIZZO_KEY,Clienti.CITTA_KEY,Clienti.TELEFONO_KEY},
				"NOT("+ Clienti.DESCRIZIONE_KEY + " LIKE '%*')",null, null,null, Clienti.DESCRIZIONE_KEY);
		
		List<Cliente> ret = new Vector<Cliente>();
		
		if(cursor != null)
		{
			while(cursor.moveToNext())
				ret.add(Select(cursor));
			cursor.close();
		}

		return ret;
	}
	private static Cliente Select(Cursor cursor)
	{
		Cliente ret = null;
		
		if(cursor != null && !cursor.isAfterLast())
		{	
			ret = new Cliente();
			
			ret.ID = cursor.getInt(0);
			ret.Ditta = cursor.getInt(1);
			ret.Codice = cursor.getString(2);
			ret.Descrizione = cursor.getString(3);
			ret.Indirizzo = cursor.getString(4);
			ret.Citta = cursor.getString(5);
			ret.Telefono = cursor.getString(6);
		}
		return ret;
	}
	public static boolean Exists(int idCliente) {
		Cursor cursor = Common.db.query(Clienti.TABLE_NAME,new String[] { Clienti.ID_KEY }, Clienti.ID_KEY + "=" + Integer.toString(idCliente), null, null, null, null);

		int count = 0;
		if (cursor != null) {
			count = cursor.getCount();
			cursor.close();
		}
		return (count > 0);
	}
	public static class Cliente  implements Serializable
	{
		private static final long serialVersionUID = 134L;
		
		public int ID, Ditta;
		public String Codice, Descrizione, Indirizzo, Citta, Telefono;
		public Cliente(){}
		
		public List<String> GetExtraordinaryJobs()
		{
			return Destinazioni.GetExtraordinaryJobs(this.ID);
		}
		
		public static List<Cliente> GetFromXml(String xml)
		{
			List<Cliente> ret = new Vector<Cliente>();
			
			if(xml !=null)
			{
				NodeList nodi = XmlParser.ParseNodes(xml, "CLIENTE");
				if(nodi !=null)
				{
					int nodesCount = nodi.getLength();
					Cliente t = null;
					
					for(int i=0; i < nodesCount; i++)
					{
						t = ParseFromXmlNode(nodi.item(i));
						if(t != null)
							ret.add(t);
					}
					
					t = null;
					nodi = null;
				}
				else
					Log.e("Cliente.GetFromXml", "Errore durante il parse dei nodi, ritornato null");
			}
			else
				Log.e("Cliente.GetFromXml", "Parametro xml nullo");
			
			return ret;
		}
		private static Cliente ParseFromXmlNode(Node nodo) {
			Cliente ret = new Cliente();
			
			NodeList dettagli = nodo.getChildNodes();
			int detailsCount = dettagli.getLength();
			
			Element dettaglio = null;
			String nome = "";
			String valore = "";
			
			for(int i=0;i<detailsCount;i++)
			{
				try {
					if(dettagli.item(i).getNodeType() == Node.ELEMENT_NODE)
					{
						dettaglio = (Element)dettagli.item(i);
						nome = dettaglio.getNodeName();
						valore = dettaglio.getTextContent();
						
						if(nome.equals("ID"))
							ret.ID = Integer.parseInt(valore.trim());
						else if(nome.equals("CL01_DITTA_FW01"))
							ret.Ditta = Integer.parseInt(valore.trim());
						else if(nome.equals("CL01_CODICE"))
							ret.Codice = valore.trim();
						else if(nome.equals("CL01_DESCRIZIONE"))
							ret.Descrizione = valore.trim();
						else if(nome.equals("CL01_INDIRIZZO"))
						{
							valore = valore.trim();
							//trovo il cap, partendo dal fondo fino a che non trovo un numero
							int len = valore.length();
							int pos = len -1;
							boolean inizioCAP = false;
							
							while(pos >= 0)
							{
								if(!inizioCAP && Character.isDigit(valore.charAt(pos)))
									inizioCAP = true;
								if(inizioCAP && valore.charAt(pos) == ' ')
								{
									ret.Indirizzo = valore.substring(0,pos);
									valore = valore.substring(pos + 7); //' 41100 '
									if(valore.lastIndexOf(' ') > -1)
										ret.Citta = valore.substring(0,valore.lastIndexOf(' '));
									else
										ret.Citta = valore;
									break;
								}
								pos--;
							}
						}
						else if(nome.equals("CL01_TELEFONO"))
							ret.Telefono = valore.trim();
						
					}
				} catch (Exception e) {
					Log.e("Cliente.ParseFromXmlNode", "Errore nel ciclo di assegnazione valori. Errore: " + e.toString());
					ret = null;
					break;
				}
			}
			
			dettaglio = null;
			dettagli = null;
			
			return ret;
		}
	}
	
	public static class ClientiAdapter extends  ArrayAdapter<Cliente> implements SectionIndexer
	{
		Context context;
		List<Cliente> dataSource;
		HashMap<String, Integer> alphaIndexer;
		String[] sections;
		
		public ClientiAdapter(Context context, List<Cliente> source) 
		{
			super(context, R.layout.combobox_item_selection, source);
			this.context = context;
			this.dataSource = source;
			
			alphaIndexer = new HashMap<String, Integer>();
            int size = source.size();
            
            //String firstLetterBefore = "";
            String firstLetterNow = "";
            for (int x = 0; x < size; x++)
            {
            	firstLetterNow = source.get(x).Descrizione.substring(0, 1).toUpperCase();
            	//if(!firstLetterBefore.equals(firstLetterNow))
            		alphaIndexer.put(firstLetterNow, x);
            }
            	
	 
	        Set<String> sectionLetters = alphaIndexer.keySet();
	 
		    // create a list from the set to sort
	        ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
	        Collections.sort(sectionList);
	        sections = new String[sectionList.size()];
	        sectionList.toArray(sections);
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			return ReturnViewItem( position, convertView, parent, false);
		}
		
		@Override
		public Cliente getItem(int position){
	       return dataSource.get(position);
		}
		
		@Override
	    public long getItemId(int position){
	       return position;
	    }
	
	    @Override
	    public View getDropDownView(int position, View convertView,ViewGroup parent) {
	    	return ReturnViewItem( position, convertView, parent, true);
	    }
	    
	    private View ReturnViewItem(int position, View convertView,ViewGroup parent, boolean isDropDown)
	    {
	    	View riga = convertView;
			ItemViewHolder holder;

			if (riga == null) {
				LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
				
				// creo un holder per gli oggetti in questa vista
				holder = new ItemViewHolder();

				riga = inflater.inflate(R.layout.combobox_item_selection, parent, false);
				holder.txtTesto = (TextView) riga.findViewById(R.id.combobox_item_selection_txtTesto);
				
				// e lo memorizzo nella vista
				riga.setTag(holder);
			} 
			else 
				holder = (ItemViewHolder) riga.getTag(); // mi ricarico l'holder degli oggetti

			holder.txtTesto.setText(dataSource.get(position).Descrizione);
			
			return riga;
	    }

		private class ItemViewHolder {
			TextView txtTesto;
		}

		@Override
		public int getPositionForSection(int section) {
			if(alphaIndexer != null)
				return alphaIndexer.get(sections[(section > 0 ? section -1 : section)]);
			else
				return 0;
		}
		@Override
		public int getSectionForPosition(int position) {
			return 1;
		}
		@Override
		public Object[] getSections() {
			return sections;
		}
		
		public int getItemPosition(int itemID)
		{
			if(this.dataSource == null || this.dataSource.size() == 0) return -1;
			
			int ret = -1;
			int size = this.dataSource.size();
			
			Cliente c = null;
			for(int i=0; i < size; i++ )
			{
				c = this.dataSource.get(i);
				if(c.ID == itemID)
				{
					ret = i;
					break;
				}
			}
			
			c = null;
			return ret;
		}
	}
}

